package main

import (
	"fmt"
	"net"
	"net/rpc"
)

type Hello struct {
}

// SayHello 定义一个方法
/*
	1、方法必须是公开的（首字母大写）
	2、方法只能有两个可序列化的参数，其中第二个参数必须是指针类型，这样才能修改真正的修改入参变量。（channel（通道）、complex（复数类型）、func（函数）均不能进行 序列化）
	3、方法要返回一个error类型
*/
func (Hello) SayHello(request string, response *string) error {
	*response = "rpc中方法调用成功，接收参数：" + request
	return nil
}

func main() {
	//一、把Hello方法在rpc上注册
	err := rpc.RegisterName("hello", new(Hello))
	if err != nil {
		fmt.Printf("注册服务失败，err-->%v", err)
		return
	}
	//二、监听端口
	listener, err := net.Listen("tcp", "127.0.0.1:9900")
	if err != nil {
		fmt.Printf("端口被占用，err-->%v", err)
		return
	}
	//三、退出时关闭监听
	defer listener.Close()

	for {
		//四、监听端口建立的连接。（只有在监听到连接后，代码才会向下运行，否则一直卡在这里）
		fmt.Println("开始监听连接")
		conn, err := listener.Accept()
		if err != nil {
			fmt.Printf("监听连接失败，err-->%v", err)
			return
		}

		//五、把建立的连接绑定到rpc服务
		rpc.ServeConn(conn)
	}

}
